package com.atguigu.srb.oss.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.CannedAccessControlList;
import com.atguigu.srb.oss.service.FileService;
import com.atguigu.srb.oss.util.OssProperties;
import java.io.InputStream;
import java.util.UUID;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;

/**
 * 上传文件到阿里云实现
 *
 * @author lupengning
 * @version 1.0
 * @description:
 * @date 2021/6/5 3:00
 */
@Service
public class FileServiceImpl implements FileService {

  @Override
  public String upload(InputStream inputStream, String module, String fileName) {

    OSS ossClient = this.ossClientBuilder();

    // 填写本地文件的完整路径。如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件流。
    //    InputStream inputStream = new FileInputStream("D:\\localpath\\examplefile.txt");
    // 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。

    //判断BUCKET_NAME在远端存在
    if (!ossClient.doesBucketExist(OssProperties.BUCKET_NAME)) {
      ossClient.createBucket(OssProperties.BUCKET_NAME);
      //设置公共读
      ossClient.setBucketAcl(OssProperties.BUCKET_NAME, CannedAccessControlList.PublicRead);
    }

    //上传文件流,构建时间文件路径
    String timeFolder = new DateTime().toString("yyyy/MM/dd");
    fileName = UUID.randomUUID().toString() + fileName.substring(fileName.lastIndexOf("."));
    String fileDirectory = module + "/" + timeFolder + fileName;
    ossClient.putObject(OssProperties.BUCKET_NAME, fileDirectory, inputStream);

// 关闭OSSClient。
    ossClient.shutdown();
    //返回文件url地址 https://gulimall-lpn.oss-cn-shenzhen.aliyuncs.com/%E8%B5%B5%E9%87%91%E9%BA%A6.jpg
    return "https://" + OssProperties.BUCKET_NAME + "." + OssProperties.ENDPOINT + "/" + fileDirectory;
  }

  @Override
  public void removeFile(String url) {
    OSS ossClient = this.ossClientBuilder();
    // 删除文件。如需删除文件夹，请将ObjectName设置为对应的文件夹名称。如果文件夹非空，则需要将文件夹下的所有object删除后才能删除该文件夹。
    String host = "https://" + OssProperties.BUCKET_NAME + "." + OssProperties.ENDPOINT + "/";
    String objectName = url.substring(host.length());
    ossClient.deleteObject(OssProperties.BUCKET_NAME, objectName);
    ossClient.shutdown();
  }

  /**
   * 生成连接OSS客户端
   * @return
   */
  private OSS ossClientBuilder() {
    // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
    String endpoint = OssProperties.ENDPOINT;
    // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
    String accessKeyId = OssProperties.KEY_ID;
    String accessKeySecret = OssProperties.KEY_SECRET;
    // 创建OSSClient实例。
    return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
  }
}
